From 67b8b1910dd21053f7fec3a336cd96775d4f018b Mon Sep 17 00:00:00 2001 From: robertl Date: Sun, 2 Sep 2007 21:36:50 +0000 Subject: [PATCH] More debugging tweaks for dg-100. --- gpsbabel/dg-100.c | 89 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 28 deletions(-) diff --git a/gpsbabel/dg-100.c b/gpsbabel/dg-100.c index 96c9ffed6..f5ff78635 100644 --- a/gpsbabel/dg-100.c +++ b/gpsbabel/dg-100.c @@ -59,18 +59,19 @@ struct dg100_command { int sendsize; int recvsize; int trailing_bytes; + const char *text; /* Textual description for debugging */ }; struct dg100_command dg100_commands[] = { - { dg100cmd_getconfig, 0, 44+2, 2 }, - { dg100cmd_setconfig, 41, 4+2, 2 }, + { dg100cmd_getconfig, 0, 44+2, 2, "getconfig" }, + { dg100cmd_setconfig, 41, 4+2, 2, "setconfig" }, /* the getfileheader answer has variable length, -1 is a dummy value */ - { dg100cmd_getfileheader, 2, -1 , 2 }, - { dg100cmd_getfile, 2, 1024+2, 2 }, - { dg100cmd_erase, 2, 4+2, 2 }, - { dg100cmd_getid, 0, 8+2, 2 }, - { dg100cmd_setid, 8, 4+2, 2 }, - { dg100cmd_gpsmouse, 1, 0 , 0 } + { dg100cmd_getfileheader, 2, -1 , 2, "getfileheader" }, + { dg100cmd_getfile, 2, 1024+2, 2, "getfile" }, + { dg100cmd_erase, 2, 4+2, 2, "erase" }, + { dg100cmd_getid, 0, 8+2, 2, "getid" }, + { dg100cmd_setid, 8, 4+2, 2, "setid" }, + { dg100cmd_gpsmouse, 1, 0 , 0, "gpsmouse" } }; const unsigned dg100_numcommands = sizeof(dg100_commands) / sizeof(dg100_commands[0]); @@ -150,19 +151,35 @@ bintime2utc(int date, int time) static void dg100_debug(const char *hdr, int include_nl, size_t sz, unsigned char *buf) { - int i; + int i; - if (global_opts.debug_level < 1) return; + /* Only give byte dumps for higher debug levels */ + if (global_opts.debug_level < 5) { + return; + } - fprintf(stderr, "%s", hdr); - - for (i = 0; i < sz; i++) { - fprintf(stderr, "%02x ", buf[i]); - } + fprintf(stderr, "%s", hdr); + + for (i = 0; i < sz; i++) { + fprintf(stderr, "%02x ", buf[i]); + } - if (include_nl) { - fprintf(stderr, "\n"); - } + if (include_nl) { + fprintf(stderr, "\n"); + } +} + +static void +dg100_log(const char *fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + if (global_opts.debug_level < 1) { + return; + } + + vfprintf(stderr, fmt, ap); + va_end(ap); } @@ -287,7 +304,16 @@ dg100_send(gbuint8 cmd, const void *payload, size_t count) be_write16(frame + framelen - 2, 0xB0B3); n = gbser_write(serial_handle, frame, framelen); - dg100_debug(n == 0 ? "Sent: " : "Error Sending:", 1, framelen, frame); + + if (global_opts.debug_level) { + struct dg100_command *cmdp = dg100_findcmd(cmd); + + dg100_debug(n == 0 ? "Sent: " : "Error Sending:", + 1, framelen, frame); + dg100_log("TX: Frame Start %02x %02x Payload_Len %04x Cmd: %s\n", + frame[0], frame[1], payload_len, cmdp->text); + } + if (n == gbser_ERROR) { fatal("dg_100_send: write failed\n"); } @@ -326,10 +352,10 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload) /* consume input until frame head sequence 0xA0A2 was received */ frame_head = 0; - dg100_debug("Receiving ", 0, 0, NULL); + dg100_debug("Receiving ", 0, 0, NULL); do { c = dg100_recv_byte(); - dg100_debug("", 0, 1, &c); + dg100_debug("", 0, 1, &c); frame_head <<= 8; frame_head |= c; @@ -358,7 +384,7 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload) /* read Payload Length, Command ID, and two further bytes */ for (i = 2; i < 7; i++) { buf[i] = dg100_recv_byte(); - dg100_debug("", 0, 1, &buf[i]); + dg100_debug("", 0, 1, &buf[i]); } payload_len_field = be_read16(buf + 2); @@ -407,7 +433,7 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload) * read the rest of the frame at once using gbser_read_wait(). */ for (i = 7; i < frame_len; i++) { buf[i] = dg100_recv_byte(); - dg100_debug("", 0, 1, &buf[i]); + dg100_debug("", 0, 1, &buf[i]); } frame_start_seq = be_read16(buf + 0); @@ -416,8 +442,11 @@ dg100_recv_frame(struct dg100_command **cmdinfo_result, gbuint8 **payload) payload_checksum = be_read16(buf + frame_len - 4); frame_end_seq = be_read16(buf + frame_len - 2); - /* calculate checksum */ - sum = dg100_checksum(buf + 4, frame_len - 8); + dg100_log("RX: Start %04x Len %04x Cmd: %s\n", + frame_start_seq, payload_len_field, cmdinfo->text); + + /* calculate checksum */ + sum = dg100_checksum(buf + 4, frame_len - 8); if (sum != payload_checksum) { fatal("checksum mismatch: data sum is 0x%04x, checksum received is 0x%04x\n", sum, payload_checksum); @@ -516,11 +545,15 @@ dg100_getfileheaders(struct dynarray16 *headers) h = dynarray16_alloc(headers, numheaders); for (i = 0; i < numheaders; i++) { offset = 4 + i * 12; - //time = be_read32(answer + offset); - //date = be_read32(answer + offset + 4); seqnum = be_read32(answer + offset + 8); - //ti = bintime2utc(date, time); h[i] = seqnum; + if (global_opts.debug_level) { + int time = be_read32(answer + offset); + int date = be_read32(answer + offset + 4); + time_t ti = bintime2utc(date, time); + dg100_log("Header #%d: Seq: %d Time: %s", + i, seqnum, ctime(&ti)); + } } } while (numheaders != 0); } -- 2.30.2